import { useEffect, JSX } from 'react';
<% if (prerender === 'SSG') { -%>
import { GetStaticPaths, GetStaticProps } from 'next';
<% } else if (prerender === 'SSR') { -%>
import { GetServerSideProps } from 'next';
<% } -%>
import NotFound from 'src/NotFound';
import Layout from 'src/Layout';
import {
SitecoreContext,
ComponentPropsContext,
SitecorePageProps,
<% if (prerender === 'SSG') { -%>
StaticPath
<% } -%>
} from '@sitecore-content-sdk/nextjs';
import { extractPath, handleEditorFastRefresh } from '@sitecore-content-sdk/nextjs/utils';
import { isDesignLibraryPreviewData } from '@sitecore-content-sdk/nextjs/editing';
import client from 'lib/sitecore-client';
import components from 'lib/component-map';
import scConfig from 'sitecore.config';
const SitecorePage = ({ notFound, componentProps, layout }: SitecorePageProps): JSX.Element => {
useEffect(() => {
// Since Sitecore Editor does not support Fast Refresh, need to refresh editor chromes after Fast Refresh finished
handleEditorFastRefresh();
}, []);
if (notFound || !layout.sitecore.route) {
// Shouldn't hit this (as long as 'notFound' is being returned below), but just to be safe
return ;
}
return (
);
};
<% if (prerender === 'SSG') { -%>
// This function gets called at build and export time to determine
// pages for SSG ("paths", as tokenized array).
export const getStaticPaths: GetStaticPaths = async (context) => {
// Fallback, along with revalidate in getStaticProps (below),
// enables Incremental Static Regeneration. This allows us to
// leave certain (or all) paths empty if desired and static pages
// will be generated on request (development mode in this example).
// Alternatively, the entire sitemap could be pre-rendered
// ahead of time (non-development mode in this example).
// See https://nextjs.org/docs/basic-features/data-fetching/incremental-static-regeneration
let paths: StaticPath[] = [];
let fallback: boolean | 'blocking' = 'blocking';
if (process.env.NODE_ENV !== 'development' && !scConfig.disableStaticPaths) {
try {
paths = await client.getPagePaths(context?.locales || []);
} catch (error) {
console.log('Error occurred while fetching static paths');
console.log(error);
}
fallback = process.env.EXPORT_MODE ? false : fallback;
}
return {
paths,
fallback,
};
};
// This function gets called at build time on server-side.
// It may be called again, on a serverless function, if
// revalidation (or fallback) is enabled and a new request comes in.
export const getStaticProps: GetStaticProps = async (context) => {
<% } else if (prerender === 'SSR') { -%>
// This function gets called at request time on server-side.
export const getServerSideProps: GetServerSideProps = async (context) => {
<% } -%>
let props = {};
const path = extractPath(context);
let page;
if (context.preview && isDesignLibraryPreviewData(context.previewData)) {
page = await client.getDesignLibraryData(context.previewData);
} else {
page = context.preview
? await client.getPreview(context.previewData)
: await client.getPage(path, { locale: context.locale });
}
if (page) {
props = {
...page,
dictionary: await client.getDictionary({ site: page.site?.name, locale: page.locale }),
componentProps: await client.getComponentData(page.layout, context, components),
}
}
return {
props,
// Next.js will attempt to re-generate the page:
// - When a request comes in
// - At most once every 5 seconds
<% if (prerender === 'SSG') { -%>
// Next.js will attempt to re-generate the page:
// - When a request comes in
// - At most once every 5 seconds
revalidate: 5, // In seconds
<% } -%>
notFound: !page,
};
};
export default SitecorePage;